/*
* Copyright 2014 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.apiman.gateway.test.server;
import io.apiman.gateway.api.rest.impl.ApiResourceImpl;
import io.apiman.gateway.api.rest.impl.ClientResourceImpl;
import io.apiman.gateway.api.rest.impl.SystemResourceImpl;
import io.apiman.gateway.api.rest.impl.mappers.RestExceptionMapper;
import io.apiman.gateway.platforms.war.listeners.WarGatewayBootstrapper;
import io.apiman.gateway.platforms.war.servlets.WarGatewayServlet;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;
/**
* Uses Jetty to run the WAR version of the API Management gateway.
*
* @author eric.wittmann@redhat.com
*/
@SuppressWarnings({"nls", "javadoc"})
public class GatewayServer {
public static GatewayServer gatewayServer;
private Server server;
private int port;
/**
* Constructor.
* @param port which port to run the test server on
*/
public GatewayServer(int port) {
this.port = port;
gatewayServer = this;
}
/**
* @return the server port
*/
public int getPort() {
return port;
}
/**
* Start/run the server.
*/
public void start() throws Exception {
long startTime = System.currentTimeMillis();
System.out.println("**** Starting Server (" + getClass().getSimpleName() + ")");
ContextHandlerCollection handlers = new ContextHandlerCollection();
addModulesToJetty(handlers);
// Create the server.
server = new Server(port);
server.setHandler(handlers);
server.start();
long endTime = System.currentTimeMillis();
System.out.println("******* Started in " + (endTime - startTime) + "ms");
}
/**
* Stops the server.
*/
public void stop() throws Exception {
try {
server.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Configure the web application(s).
* @param handlers
* @throws Exception
*/
protected void addModulesToJetty(ContextHandlerCollection handlers) throws Exception {
/* *************
* Gateway
* ************* */
ServletContextHandler server = new ServletContextHandler(ServletContextHandler.SESSIONS);
server.setContextPath("/");
server.addEventListener(new WarGatewayBootstrapper());
ServletHolder servlet = new ServletHolder(new WarGatewayServlet());
server.addServlet(servlet, "/gateway/*");
servlet = new ServletHolder(new HttpServletDispatcher());
servlet.setInitParameter("javax.ws.rs.Application", TestGatewayApplication.class.getName());
servlet.setInitParameter("resteasy.servlet.mapping.prefix", "/api");
servlet.setInitOrder(1);
server.addServlet(servlet, "/api/*");
// Add the web contexts to jetty
handlers.addHandler(server);
}
@ApplicationPath("/")
public static class TestGatewayApplication extends Application {
/**
* Constructor.
*/
public TestGatewayApplication() {
}
@Override
public Set<Class<?>> getClasses() {
HashSet<Class<?>> classes = new HashSet<>();
classes.add(SystemResourceImpl.class);
classes.add(ApiResourceImpl.class);
classes.add(ClientResourceImpl.class);
classes.add(RestExceptionMapper.class);
return classes;
}
}
}